mongoDB 笔记

do

  • 文档最大长度为16m,性能最好
  • 文档包含的数组袁术数量保持在四位数以下
  • mongoDB没有查询优化器,建立查询时需要注意优化查询顺序,选择连接类型
  • 不要开启’file-and-forget’。启用日志’storage.journal.enabled’
  • 在需要搜索和聚合中,如果希望排序数据,最好命中索引。对于排序操作中所有文档的总大小有32MB的内存限制。
  • 在MongoDB中文档Key/Value的顺序非常重要,颠倒则认为不相等。
  • 避免使用 undefined
  • 为了保证可靠的limit,必须在之前进行sort

php5.4 升级到 php7 笔记


环境说明

当前服务版本: php5.4 mysql
准备升级到: php7.2
代码框架: tp3.2

升级预备知识点

php

PHP7.1 – PHP7.2

新特性
  • 新的对象类型object
  • 直接可以通过名称加载扩展
  • 允许重写抽象方法
  • 使用Argon2算法生成密码散列
  • 新增 ext/PDO(PDO扩展) 字符串扩展类型
  • 为 ext/PDO新增额外的模拟调试信息
  • ext/LDAP(LDAP扩展) 支持新的操作方式
  • ext/sockets(sockets扩展)添加了地址信息
  • 重写方法和接口实现的参数类型现在可以省略了
  • 允许分组命名空间的尾部逗号
  • 文档
废弃特性
  • 不再支持不带引号的字符串
  • 废弃 png2wbmp() 和 jpeg2wbmp()
  • 废弃 INTL_IDNA_VARIANT_2003 转化
  • 废弃 __autoload() 方法 , 请使用 spl_autoload_register()
  • 废弃 track_errors ini设置
  • 废弃 create_funtion()
  • 废弃 mbstring.func_overload ini设置
  • 废弃 (unset)类型强制转化
  • parse_str() 第二个参数为必填项
  • 废弃 gmp_random()
  • 废弃 each()
  • assert()禁止传入字符串参数
  • 废弃 错误处理器内的 $errcontext参数
  • 废弃 read_exif_data() 修改为 exif_read_data()
  • 文档

PHP7.0 – PHP7.1

新特性
  • 可为空类型 (Nullable)
  • void函数
  • 短数组语法([]),现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量
  • 支持设置常量可见性
  • iterable伪类
  • 多异常捕获处理
  • list()支持指定键名
  • 所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量
  • ext/openssl 支持 AEAD
  • 一个新的名为 pcntl_async_signals() 的方法现在被引入, 用于启用无需 ticks (这会带来很多额外的开销)的异步信号处理。
  • HTTP/2 server push support in ext/curl 一个对服务器推送的支持的扩展
  • 文档
废弃特性
  • 当传递参数过少时将抛出错误
  • 禁止动态调用以下函数
    • assert() – with a string as the first argument
    • compact()
    • extract()
    • func_get_args()
    • func_get_arg()
    • func_num_args()
    • get_defined_vars()
    • mb_parse_str() – with one arg
    • parse_str() – with one arg
  • 无效的class、interface、trait 名 (系统占用的关键字)
    • viod
    • iterable
  • 字符串转换支持科学表示法
  • 修正mt_rand()算法
  • rand()的别名为mt_rand();srand()的别名为mt_srand();
  • ASCII 码中的删除控制字符(0x7F) 不再被支持
  • 为 error_log 增加 syslog 类型
  • 在不完整的对象上不再调用析构方法
  • call_user_func()不再支持对传址的函数的调用
  • 字符串不再支持空索引操作符
  • 以下ini配置项被移除
    • session.entropy_file
    • session.entropy_length
    • session.hash_function
    • session.hash_bits_per_character
  • 通过引用赋值数组,引用值发生了变化,数组会进行重排序
  • 对数组排序时相等元素排序进行优化
  • E_RECOVERABLE 错误的错误消息已经从“可捕获的致命错误”更改为“可恢复的致命错误”
  • unserialize()的$options参数的allowed_classes现在是严格类型的
  • Datetime支持微秒
  • Fatal errors 和 Error exceptions 之间的转换
  • 词法绑定的变量不能重用名称
  • JSON encoding 和 decoding 对于空元素的优化
  • mb_ereg() 和 mb_eregi()参数修改
  • 不再支持 sslv2 信息流
  • 文档

PHP5.6 – PHP7.0

新特新
  • 标量类型声明。强制 (默认) 和 严格模式。
  • 返回类型声明。
  • null合并运算符 ??
  • 太空船操作符。用于比较两个表达式
  • define() 定义常量数组
  • 通过 new class 实例化一个匿名类
  • Unicode codepoint 转译语法
  • Closure::call()性能提升
  • 为unserialize()提供过滤
  • 新增加的 IntlChar 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。
  • Expectations
  • 批量use
  • 生成器可以返回表达式
  • 生成器委托。现在,只需在最外层生成其中使用 yield from, 就可以把一个生成器自动委派给其他的生成器, Traversable 对象或者 array。
  • 整数除法函数 intdiv()
  • session_start() 可以接受一个 array 作为参数, 用来覆盖 php.ini 文件中设置的 会话配置选项。
  • 新增 preg_replace_callback_array()
  • 新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数。
  • 可以使用 list() 函数来展开实现了 ArrayAccess 接口的对象
  • 允许在克隆表达式上访问对象成员
  • 文档
废除特性
  • PHP4 风格的构造函数(方法名和类名一样)将被弃用,并在将来移除。
  • 废弃了 静态(Static) 调用未声明成 static 的方法,未来可能会彻底移除该功能。
  • 废弃了 password_hash() 函数中的盐值选项,阻止开发者生成自己的盐值(通常更不安全)。开发者不传该值时,该函数自己会生成密码学安全的盐值。因此再无必要传入自己自定义的盐值。
  • 废弃了 capture_session_meta 内的 SSL 上下文选项。 现在可以通过 stream_get_meta_data() 获取 SSL 元数据(metadata)。
  • 废弃了 ldap_sort() 函数
  • 文档

PHP5.5 – PHP5.6

新特性
  • 表达式定义常量,数组定义常量
  • 使用 ... 运算符实现变长参数函数 和 参数展开
  • 使用 ** 进行幂运算, 同时支持简写 **=
  • use 运算符 被进行了扩展以支持在类中导入外部的函数和常量。 对应的结构为 use function 和 use const。
  • PHP 的 SAPI 模块中实现了一个 交互式调试器,叫做 phpdbg。 文档
  • 对于一些字符编码相关的函数,例如 htmlentities(), html_entity_decode() 以及 htmlspecialchars() 使用 default_charset 作为默认字符集。请注意,对于 iconv(现已废弃) 和 mbstring 相关的函数, 如果分别设置了他们的编码, 那么这些对应设置的优先级高于 default_charset。 default_charset 默认为UTF-8。
  • php://input可重用
  • 支持大于2GB的文件上传
  • GMP支持运算符重载
  • 使用hash_equals()比较字符串避免时序攻击
  • 加入 __debugInfo(), 当使用 var_dump() 输出对象的时候, 可以用来控制要输出的属性和值。
  • 加入 gost-crypto 散列算法。
  • 提升对SSL/TLS支持
  • pgsql异步支持
  • 文档
废弃特性
  • 从不兼容的上下文调用方法
  • $HTTP_RAW_POST_DATA 和 always_populate_raw_post_data
  • iconv 和 mbstring 编码设置

PHP5.4 – PHP5.5

新特性
  • 新增:生成器(Generators) 关键字 yield
  • 新增:关键字 finally
  • empty() 支持传入表达式
  • 数组和字符串可以直接访问指定下标(array and string literal dereferencing)
  • 新的密码哈希API password_hash()
  • 改进GD
    • 翻转支持使用新的 imageflip() 函数。
    • 高级裁剪支持使用 imagecrop() & imagecropauto() 函数。
    • WebP 的读写分别支持使用 imagecreatefromwebp() & imagewebp() 。
  • 文档
废弃特性
  • 原始的 MySQL 扩展 现在被废弃,当连接到数据库时会产生一个 E_DEPRECATED 错误。可使用 MySQLi 或 PDO_MySQL 扩展作为替代
  • 弃用preg_replace() 中的 /e 修饰符
  • IntlDateFormatter::setTimeZoneID() 和 datefmt_set_timezone_id() 现在被废弃。可分别使用 IntlDateFormatter::setTimeZone() 方法和 datefmt_set_timezone() 函数作为替代。
  • mcrypt 中废弃以下函数
    • mcrypt_cbc()
    • mcrypt_cfb()
    • mcrypt_ecb()
    • mcrypt_ofb()
  • 文档

TP3.2兼容php7

  1. 修改thinkphp下 /Library/Org/Util/String.class.php
    • 改个名字,比如 Stringstr.class.php (因为string在php7中是保留字,不能用做类名)。
    • 将Stringstr.class.php中的 类名修改为 Stringstr.
    • 将此文件中的String:: 修改为Stringstr::。
    • 修改你 项目中的所有文件中的 use Org\Util\String; 为 use Org\Util\Stringstr;
    • 所有项目文件中的 String:: 修改为Stringstr::。
  2. 配置文件中的数据库类型改为 mysqli.,并将所有文件中的 mysql_类函数修改为mysqli_函数。

xshell5 安装激活包

https://cdn.netsarang.net/4fcf6610/Xshell-5.0.1339r.exe
激活码:150105-116578-999990

获取下载链接:
目前官网只允许下载6系列,其他系列需要填入注册码。
在xshell6的下载界面下,Console执行 document.getElementById(“code”).value=522
进行下载,就可以下载xshell5。

记 一个excel导出类

class Excel
{
    /**
     * 生成导出的.csv文件, Excel打开最大行可达104w, 而 xls文件最大行数为65535
     * @param $filename
     * @param $data
     */
    public function output($filename, $data)
    {
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$filename.'.csv"');
        header('Cache-Control: max-age=0');

        $fp = fopen('php://output', 'a');
        foreach ($data as $i => $item) {
            fputcsv($fp, $data);
            if ($i % 1000 === 0) {
                ob_flush();
                flush();
            }
        }
    }
}

redis: read error on connection 问题

先说说网上常规的解决方案吧:
– 检查并优化慢操作 command> showlog get 10
– 设置超时时间 ini_set(‘default_socket_timeout’, -1);//php

以上是网上使用的最多的方法。

以上都无法解决,或者间接性抽风的,我遇到了。

情况是: 进程最初 初始化redis连接,然后跑跑跑(两三分钟之后),进行redis hmset。
我不确定是否是由于初始化之后,连接等待时间太长而自动挂起。
后来发现,在初始化连接之后,进行任何操作,可以避免出现read error on connection的情况。

现在把问题放到了v2上面,等着大佬解惑。

javaScript学习笔记

这是一个PHPer学习javascript的笔记

数据类型

  1. == 和 ===
    • ==会自动转换数据类型再比较
    • === 不会自动转换数据类型,如果数据类型不一致,返回false,如果一致则进行比较
  2. NaN
    • NaN和所有的其他值都不相等,包括他自己。只有通过 isNaN() 函数才能进行判断
  3. 浮点数比较
    • 浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值
  4. null 和 undefined
    • null表示空
    • undifined表示值未定义,静静在判断函数参数是否传递的情况下使用
  5. 对象
    • 对象的键都是字符串类型,值可以是任意类型
  6. 字符串
    • 多行字符串用` `表示
    • 模板字符串 `你好, 你今年${age}岁了!`
    • 字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果
  7. 数组
    • 如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化
    • 使用indexOf()进行搜索元素位置的时候,查询参数区分类型。例如:数字30和字符串’30’是不同的元素
    • arr.splice() 可以实现数组的删除、插入、修改操作
    • arr.concat() 相当于 array_merge()
    • arr.join() 相当于implode()
  8. 对象
    • 对象属性名不包含特殊字符,这样定义 key: value,可以直接使用 . 操作符访问
    • 包含特殊字符,这样定义 ‘special_key’: value, 必须使用x[’special_key’]来访问
    • delete obj.a 删除obj中的a属性
    • ‘a’ in obj 检查a属性是否在obj中
    • obj.hasOwnProperty(‘a’); 判断a属性是否是obj自身拥有的,而不是继承来的
  9. 条件判断
    • null undefined 0 NaN ” false 视为 false
  10. Map & Set
    • Map不会因为长度而降低查询速度
      var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
      m.get('Michael'); // 95
      // m.set m.get m.delete m.has
    • 重复元素在Set中自动被过滤, 区分字符串和数字
  11. iterable
    • Array、Map和Set都属于iterable类型
    • 可以使用 for( var item of array) 来遍历
    • iterable 内置 forEach方法 a.forEach(function (element, index, array) {});
    • 使用forEach 中 修改array的值, 无法影响当前循环,但是影响循环结束时的值

函数

  • 函数的参数可以多于预定参数,也可以少于预定参数。多于则忽略,少于则受到undefined
  • arguments永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array
  • arguments 常用于 调整传入参数和函数参数默认值
  • function foo(a, b, …rest) {} 可以将多余的参数传入 rest变量中,如果没有多余参数,rest则会变成一个空数组
  • JavaScript引擎有一个在行末自动添加分号的机制,需要注意
  • javascript的函数会先扫描整个函数体内的语句,并把所有申明的变量“提升”到函数顶部
  • let 用来声明块级变量, const 用来声明常量
  • 解构赋值 var [x, y, z] = ['hello', 'JavaScript', 'ES6'];
  • 解构赋值还可以忽略某些元素let [, , z] = ['hello', 'JavaScript', 'ES6'];
  • 函数本身自带apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
  • call方法和apply方法类似,区别在于apply是将参数打包成数组,call将参数顺序传入
    Math.max.apply(null, [3, 5, 4]); // 5
    Math.max.call(null, 3, 5, 4); // 5
  • 可以使用自定义函数替换掉默认的函数
    window.parseInt = function () {
    count += 1;
    return oldParseInt.apply(null, arguments); // 调用原函数
    };
  • 高阶函数
    • map()方法 arr.map(String) 为arr 中的所有项执行String()函数
    • reduce()方法 [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4) Array的reduce()把一个函数作用在这个Array的[x1, x2, x3…]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算
    • map()中的回调函数要求只有一个参数,否则会出现意料之外的错误

书签

filter